home *** CD-ROM | disk | FTP | other *** search
/ Languguage OS 2 / Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO / language / embedded / 68hc11 / smallc11.arc / CC12.C < prev    next >
Text File  |  1988-06-27  |  7KB  |  296 lines

  1. /*
  2. ** open an include file
  3. **
  4. **    modified -hm ( borrowed from small-c vers 2.1 )
  5. */
  6. doinclude()
  7. {
  8.   char *cp;
  9.  
  10.   blanks();      /* skip over to name */
  11.   switch(*lptr)
  12.   {
  13.     case '"':
  14.     case '<':
  15.       cp = ++lptr;
  16.       while(*cp)
  17.       {
  18.     switch(*cp)
  19.     {
  20.       case '"':
  21.       case '>':
  22.         *cp = '\0';
  23.     }
  24.     ++cp;
  25.      }
  26.   }
  27.   if((input2 = fopen(lptr,"r")) == NULL)
  28.   {
  29.     input2=EOF;
  30.     error("open failure on include file");
  31.   }
  32.   kill(); /* clear rest of line so next read will come from new file (if open) */
  33. }
  34.  
  35. /*
  36. ** test for global declarations
  37. */
  38. dodeclare(class)
  39. int class;
  40. {
  41. if(amatch("char",4))
  42.     { declglb(CCHAR, class);
  43.     ns();            /* find ";"     */
  44.     return YES;
  45.     }
  46. else if((amatch("int",3)) || (class==EXTERNAL))
  47.     { declglb(CINT, class);
  48.     ns();
  49.     return YES;
  50.     }
  51. return NO;
  52. }
  53.  
  54. /*** delcare a static variable*/
  55. declglb(type, class)
  56. int type,class;
  57. {
  58. int k, j;
  59.  
  60. while(1)
  61.     { if(endst()) return;     /* do line */
  62.     if(match("*"))
  63.     { j=POINTER;        /* j=POINTER */
  64.     k=0;
  65.     }
  66.     else {
  67.     j=VARIABLE;        /* j=VARIABLE    */
  68.     k=1;
  69.     }
  70.     if (symname(ssname, YES)==0) illname();    /* legal name?? */
  71.     if(findglb(ssname)) multidef(ssname);    /* must be defined only once    */
  72.     if(match("()")) j=FUNCTION;                 /* j=FUNCTION   */
  73.     else if (match("["))
  74.     { k=needsub();      /* get size */    /* j=ARRAY    */
  75.     j=ARRAY;   /* !0=array */
  76.     }
  77.     if(class==EXTERNAL) external(ssname);    /* is class=EXTERNAL    */
  78.     else j=initials(type>>2, j, k);
  79.     addsym(ssname, j, type, k, &glbptr, class); /* store the symbol    */
  80.     if (match(",")==0) return; /* more? */
  81.     }
  82. }
  83.  
  84. /*** declare local variables*/
  85. declloc(typ)
  86. int typ;
  87. {
  88. int k,j;
  89. if(noloc) error("not allowed with goto");
  90. if(declared < 0) error("must declare first in block");
  91. while(1) {
  92.     while(1) {
  93.       if(endst()) return;
  94.       if(match("*")) j=POINTER;
  95.       else j=VARIABLE;
  96.       if (symname(ssname, YES)==0) illname();
  97.       /* no multidef check, block-locals are together */
  98.       k=BPW;
  99.       if (match("[")) {
  100.     k=needsub();
  101.     if(k) {
  102.       j=ARRAY;
  103.       if(typ==CINT)k=k<<LBPW;
  104.       }
  105.     else j=POINTER;
  106.     }
  107.       else if(match("()")) j=FUNCTION;
  108.       else if((typ==CCHAR)&(j==VARIABLE)) k=SBPC;
  109.       declared = declared + k;
  110.       addsym(ssname, j, typ, csp - declared, &locptr, AUTOMATIC);
  111.       break;
  112.       }
  113.     if (match(",")==0) return;
  114.     }
  115. }
  116.  
  117. /*** initialize global objects*/
  118. initials(size, ident, dim)
  119. int size,ident,dim;
  120. {
  121. int savedim;
  122.  
  123. litptr=0;
  124. if(dim==0) dim = -1;
  125. savedim=dim;
  126. xentry();
  127. if(match("=")) {
  128.     if(match("{")) {
  129.       while(dim) {
  130.     init(size, ident, &dim);
  131.     if(match(",")==0) break;
  132.     }
  133.       needtoken("}");
  134.       }
  135.     else init(size, ident, &dim);
  136.     }
  137. if((dim == -1)&(dim==savedim)) {
  138.      stowlit(0, size=BPW);
  139.     ident=POINTER;
  140.     }
  141. dumplits(size);
  142. dumpzero(size, dim);
  143. return ident;
  144. }
  145.  
  146. /*** evaluate one initializer*/
  147. init(size, ident, dim)
  148. int    size, ident, *dim;
  149. {
  150. int value;
  151.  
  152. if(qstr(&value))
  153.     { if((ident==VARIABLE)|(size!=1))
  154.     error("must assign to char pointer or array");
  155.     *dim = *dim - (litptr - value);
  156.     if(ident==POINTER) point();
  157.     }
  158. else if(constexpr(&value))
  159.     { if(ident==POINTER)
  160.     error("cannot assign to pointer");
  161.     stowlit(value, size);
  162.     *dim = *dim - 1;
  163.     }
  164. }
  165.  
  166. /*
  167. ** get required array size
  168. */
  169. needsub()
  170. {
  171. int    val;
  172.  
  173. if(match("]")) return 0; /* null size */
  174.   if (constexpr(&val)==0) val=1;
  175.   if (val<0) {
  176.     error("negative size illegal");
  177.     val = -val;
  178.     }
  179.   needtoken("]");      /* force sidimension */
  180.   return val;           /* and return size */
  181.   }
  182.  
  183. /*
  184. ** begin a function
  185. **
  186. ** called from "parse" and tries to make a function
  187. ** out of the following text
  188. **
  189. ** Patched per P.L. Woods (DDJ #52)
  190. */
  191. newfunc()  {
  192. char *ptr;
  193.   nogo    =          /* enable goto statements */
  194.   noloc = 0;          /* enable block-local declarations */
  195.   lastst=          /* no statement yet */
  196.   litptr=0;          /* clear lit pool */
  197.   litlab=getlabel();  /* label next lit pool */
  198.   locptr=STARTLOC;    /* clear local variables */
  199.   if(monitor == YES)
  200.     fprintf(stderr,"\n%s",line);
  201.   if (symname(ssname, YES)==0) {
  202.     error("illegal function or declaration");
  203.     kill(); /* invalidate line */
  204.     return;
  205.     }
  206. /*
  207. ot(" xdef ");
  208. outstr(ssname);
  209. nl();
  210.     */
  211. if(func1) {
  212.     postlabel(beglab);
  213.     func1=0;
  214.     }
  215. if(ptr=findglb(ssname)) {      /* already in symbol table ? */
  216.     if(ptr[IDENT]!=FUNCTION)       multidef(ssname);
  217.     else if(ptr[OFFSET]==FUNCTION) multidef(ssname);
  218.     else ptr[OFFSET]=FUNCTION;
  219.       /*  earlier assumed to be a function */
  220.     }
  221. else
  222.     addsym(ssname, FUNCTION, CINT, FUNCTION, &glbptr, STATIC);
  223. if(match("(")==0) error("no open paren");
  224. xentry();
  225. locptr=STARTLOC;
  226. argstk=0;        /* init arg count */
  227. while(match(")")==0) {  /* then count args */
  228.     /* any legal name bumps arg count */
  229.     if(symname(ssname, YES)) {
  230.       if(findloc(ssname)) multidef(ssname);
  231.       else {
  232.     addsym(ssname, 0, 0, argstk, &locptr, AUTOMATIC);
  233.     argstk=argstk+BPW;
  234.     }
  235.       }
  236.     else {error("illegal argument name");junk();}
  237.     blanks();
  238.     /* if not closing paren, should be comma */
  239.     if(streq(lptr,")")==0) {
  240.       if(match(",")==0) error("no comma");
  241.       }
  242.     if(endst()) break;
  243.     }
  244. csp=0;          /* preset stack ptr */
  245. argtop=argstk;
  246. while(argstk) {
  247.   /* now let user declare what types of things */
  248.     /*        those arguments were */
  249.     if(amatch("char",4))     {doargs(CCHAR);ns();}
  250.     else if(amatch("int",3)) {doargs(CINT);ns();}
  251.     else {error("wrong number of arguments");break;}
  252.     }
  253. if(statement()!=STRETURN) ret();
  254. if(litptr) {
  255.     printlabel(litlab);
  256.     dumplits(1); /* dump literals */
  257.     }
  258. }
  259.  
  260. /*
  261. ** declare argument types
  262. **
  263. ** called from "newfunc" this routine adds an entry in the
  264. ** local symbol table for each named argument
  265. **
  266. ** rewritten per P.L. Woods (DDJ #52)
  267. */
  268. doargs(t)
  269. {
  270. int j, legalname;
  271. char c, *argptr;
  272.   while(1) {
  273.     if(argstk==0) return; /* no arguments */
  274.     if(match("*")) j=POINTER; else j=VARIABLE;
  275.     if((legalname=symname(ssname, YES))==0) illname();
  276.     if(match("[")) {   /* is it a pointer? */
  277.       /* yes, so skip stuff between "[...]" */
  278.       while(inbyte()!=']') if(endst()) break;
  279.       j=POINTER; /* add entry as pointer */
  280.       }
  281.     if(legalname) {
  282.       if(argptr=findloc(ssname)) {
  283.     /* add details of type and address */
  284.     argptr[IDENT]=j;
  285.     argptr[TYPE]=t;
  286.     putint(argtop-getint(argptr+OFFSET, OFFSIZE), argptr+OFFSET, OFFSIZE);
  287.     }
  288.       else error("not an argument");
  289.       }
  290.     argstk=argstk-BPW;          /* cnt down */
  291.     if(endst())return;
  292.     if(match(",")==0) error("no comma");
  293.     }
  294.   }
  295.  
  296.